package com.ruoyi.web.service.impl;

import com.gitee.deeround.jdbchelper.DbAction;
import com.gitee.deeround.jdbchelper.out.DataType;
import com.gitee.deeround.jdbchelper.out.DbColumn;
import com.gitee.deeround.jdbchelper.out.DbTable;
import com.ruoyi.web.domain.SysMod;
import com.ruoyi.web.domain.SysModColumn;
import com.ruoyi.web.exception.ApiException;
import com.ruoyi.web.service.SysModDbService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class SysModDbServiceImpl implements SysModDbService {

    @Autowired
    private DbAction dbAction;

    @Override
    public void createTable(SysMod entity) {

        if (!dbAction.existsTable(entity.getTableName())) {
            //创建表
            DbTable dbTable = new DbTable();
            dbTable.setTableName(entity.getTableName());
            dbTable.setTableComment(entity.getModName());

            List<DbColumn> columnList = new ArrayList<>();

            DbColumn dbColumn = new DbColumn();
            dbColumn.setColumnName(entity.getPrimaryKey());
            dbColumn.setDataType(DataType.String);
            dbColumn.setDataLength(32);
            dbColumn.setColumnKey("1");
            columnList.add(dbColumn);

            DbColumn dbColumn1 = new DbColumn();
            dbColumn1.setColumnName("instance_id");
            dbColumn1.setDataType(DataType.String);
            dbColumn1.setDataLength(32);
            dbColumn1.setColumnNullable("1");
            columnList.add(dbColumn1);

            DbColumn dbColumn2 = new DbColumn();
            dbColumn2.setColumnName("node_id");
            dbColumn2.setDataType(DataType.String);
            dbColumn2.setDataLength(32);
            dbColumn2.setColumnNullable("1");
            columnList.add(dbColumn2);

            DbColumn dbColumn3 = new DbColumn();
            dbColumn3.setColumnName("state");
            dbColumn3.setDataType(DataType.String);
            dbColumn3.setDataLength(50);
            dbColumn3.setColumnNullable("1");
            columnList.add(dbColumn3);

            DbColumn dbColumn4 = new DbColumn();
            dbColumn4.setColumnName("create_by");
            dbColumn4.setDataType(DataType.String);
            dbColumn4.setDataLength(32);
            dbColumn4.setColumnNullable("1");
            columnList.add(dbColumn4);

            DbColumn dbColumn5 = new DbColumn();
            dbColumn5.setColumnName("create_time");
            dbColumn5.setDataType(DataType.Date);
            dbColumn5.setDataLength(32);
            dbColumn5.setColumnNullable("1");
            columnList.add(dbColumn5);

            DbColumn dbColumn6 = new DbColumn();
            dbColumn6.setColumnName("update_by");
            dbColumn6.setDataType(DataType.String);
            dbColumn6.setDataLength(32);
            dbColumn6.setColumnNullable("1");
            columnList.add(dbColumn6);

            DbColumn dbColumn7 = new DbColumn();
            dbColumn7.setColumnName("update_time");
            dbColumn7.setDataType(DataType.Date);
            dbColumn7.setDataLength(32);
            dbColumn7.setColumnNullable("1");
            columnList.add(dbColumn7);

            DbColumn dbColumn8 = new DbColumn();
            dbColumn8.setColumnName("create_dept");
            dbColumn8.setDataType(DataType.String);
            dbColumn8.setDataLength(32);
            dbColumn8.setColumnNullable("1");
            columnList.add(dbColumn8);

            dbTable.setColumnList(columnList);
            dbAction.createTable(dbTable);
        }

    }

    @Override
    public void deleteTable(SysMod entity) {

        if (dbAction.existsTable(entity.getTableName())) {
            if ("17005103583592448".equals(entity.getGroupId())) {
                throw new ApiException("系统管理模块不能删除");
            }
            dbAction.dropTable(entity.getTableName());
        }

    }

    @Override
    public void addColumn(SysMod mod, SysModColumn entity) {

        if (!dbAction.existsTableColumn(mod.getTableName(), entity.getColumnName())) {

            DbColumn dbColumn = new DbColumn();
            dbColumn.setTableName(mod.getTableName());
            dbColumn.setColumnName(entity.getColumnName());
            dbColumn.setDataType(DataType.valueOf(entity.getDataType()));
            dbColumn.setDataLength(entity.getDataLength());
            dbColumn.setDataScale(entity.getDataScale());

            dbAction.addTableColumn(dbColumn);
        }

    }

    @Override
    public void editColumn(SysMod mod, SysModColumn entity) {
        if (dbAction.existsTableColumn(mod.getTableName(), entity.getColumnName())) {

            DbColumn dbColumn = new DbColumn();
            dbColumn.setTableName(mod.getTableName());
            dbColumn.setColumnName(entity.getColumnName());
            dbColumn.setDataType(DataType.valueOf(entity.getDataType()));
            dbColumn.setDataLength(entity.getDataLength());
            dbColumn.setDataScale(entity.getDataScale());

            dbAction.modifyTableColumn(dbColumn);
        }
    }

    @Override
    public void deleteColumn(SysMod mod, SysModColumn entity) {

        if (dbAction.existsTableColumn(mod.getTableName(), entity.getColumnName())) {
            if ("1".equals(entity.getIsPrimaryKey())) {
                throw new ApiException("主键不能删除");
            }
            dbAction.removeTableColumn(mod.getTableName(), entity.getColumnName());
        }

    }
}
